﻿namespace LK
{
	namespace Functional
	{
		/**@brief 表示一个通用函数对象接口*/
		struct IFunObjs;
		/**@brief 表示通用的函数对象代理*/
		struct PFunObjs;
		//仿函数异常
		struct FunctionalException;
		/**
		@brief 表示一个函数对象接口*/
		template<class FunType>struct IFunObj;
		/**
		@brief 表示一个函数对象接口的代理*/
		template<class FunType>struct PFunObj;
		/**
		@brief 表示一个具体的函数对象，Lambda表示函数类型，ArgsPack表示返回值、对象和调用参数类型，IsFun用以指示Lambda是否为函数*/
		template<class Lambda, class ArgsPack, bool IsFun>struct FunObject;
		/**
		@brief 表示一个具体的函数对象代理，Lambda表示函数类型，ArgsPack表示返回值、对象和调用参数类型，IsFun用以指示Lambda是否为函数*/
		template<class Lambda, class ArgsPack, bool IsFun>struct PFunObject;
		/**
		@brief 用以将参数由指针数组展开*/
		template<class Fun, class ArgsPack, size_t count>struct InvokeVariadic;

		/**@brief 表示一个委托代理*/
		struct PDelegates;
		/**@brief 表示一个委托接口*/
		struct IDelegates;
		/**@brief 表示一个动作接口*/
		struct IActions;
		/**
		@brief 表示一个具体类型的委托对象代理*/
		template<class FunType>struct PDelegate;
		/**
		@brief 表示一个具体类型的委托对象*/
		template<class FunType>struct IDelegate;
#ifdef SUPPORT_VARIADIC_TEMPLATES//使用可变参模板
		/**
		@brief 表示一个全局或类静态函数对象代理（偏特化）*/
		template<class FunctionType, class ReturnType, class ...ArgumentsType>
		struct PFunObject<FunctionType, VarArgsPack<ReturnType, void, ArgumentsType...>, true>;
		/**
		@brief 表示一个非静态成员函数对象代理（偏特化）*/
		template<class FunctionType, class ReturnType, class CType, class ...ArgumentsType>
		struct PFunObject<FunctionType, VarArgsPack<ReturnType, CType, ArgumentsType...>, true>;
#else
#endif
	}
}